home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / demo / vtskt10i.zip / FTP_FORM.FRM < prev    next >
Text File  |  1994-02-13  |  40KB  |  1,633 lines

  1. VERSION 2.00
  2. Begin Form ftp_form 
  3.    Caption         =   "VT File Transfer"
  4.    ClientHeight    =   4845
  5.    ClientLeft      =   1080
  6.    ClientTop       =   1755
  7.    ClientWidth     =   7275
  8.    Height          =   5535
  9.    Icon            =   FTP_FORM.FRX:0000
  10.    Left            =   1020
  11.    LinkTopic       =   "Form1"
  12.    ScaleHeight     =   4845
  13.    ScaleWidth      =   7275
  14.    Top             =   1125
  15.    Width           =   7395
  16.    Begin WinSock ftpdata 
  17.       Client_or_Server=   1  'Server
  18.       Index           =   0
  19.       Interval        =   0
  20.       IPName          =   ""
  21.       Left            =   630
  22.       LicDate         =   0
  23.       License1        =   ""
  24.       License2        =   ""
  25.       Licensed        =   0
  26.       Linger          =   0   'False
  27.       Port            =   0
  28.       RecvBufSize     =   0
  29.       SendBufSize     =   0
  30.       Top             =   4320
  31.    End
  32.    Begin WinSock ftpcntl 
  33.       Client_or_Server=   0  'Client
  34.       Interval        =   0
  35.       IPName          =   ""
  36.       Left            =   150
  37.       LicDate         =   0
  38.       License1        =   ""
  39.       License2        =   ""
  40.       Licensed        =   0
  41.       Linger          =   0   'False
  42.       Port            =   0
  43.       RecvBufSize     =   0
  44.       SendBufSize     =   0
  45.       Top             =   4320
  46.    End
  47.    Begin PictureBox transfer_child 
  48.       BackColor       =   &H00C0C0C0&
  49.       Height          =   1185
  50.       Left            =   210
  51.       ScaleHeight     =   1155
  52.       ScaleWidth      =   5805
  53.       TabIndex        =   19
  54.       Top             =   2820
  55.       Visible         =   0   'False
  56.       Width           =   5835
  57.       Begin CommandButton transfer_cancel 
  58.          Caption         =   "Cancel"
  59.          Height          =   405
  60.          Left            =   2520
  61.          TabIndex        =   20
  62.          Top             =   690
  63.          Width           =   855
  64.       End
  65.       Begin Shape pct_cmpl 
  66.          BackColor       =   &H00FF0000&
  67.          BackStyle       =   1  'Opaque
  68.          Height          =   345
  69.          Left            =   60
  70.          Top             =   300
  71.          Width           =   75
  72.       End
  73.       Begin Label pct_box 
  74.          BorderStyle     =   1  'Fixed Single
  75.          Height          =   345
  76.          Left            =   60
  77.          TabIndex        =   27
  78.          Top             =   300
  79.          Width           =   5655
  80.       End
  81.       Begin Label Label3 
  82.          BackColor       =   &H00C0C0C0&
  83.          Caption         =   "File transfer is in progress.  Press CANCEL to ABORT the transfer."
  84.          Height          =   285
  85.          Left            =   60
  86.          TabIndex        =   21
  87.          Top             =   30
  88.          Width           =   5685
  89.       End
  90.       Begin Label Label6 
  91.          BackColor       =   &H00C0C0C0&
  92.          Height          =   285
  93.          Left            =   1050
  94.          TabIndex        =   22
  95.          Top             =   150
  96.          Width           =   3495
  97.       End
  98.    End
  99.    Begin PictureBox function_child 
  100.       BackColor       =   &H00C0C0C0&
  101.       Height          =   1575
  102.       Left            =   2490
  103.       ScaleHeight     =   1545
  104.       ScaleWidth      =   4575
  105.       TabIndex        =   12
  106.       Top             =   2880
  107.       Visible         =   0   'False
  108.       Width           =   4605
  109.       Begin TextBox copy_rename 
  110.          Height          =   315
  111.          Left            =   1050
  112.          TabIndex        =   26
  113.          Top             =   750
  114.          Width           =   3495
  115.       End
  116.       Begin CommandButton copy_button 
  117.          Caption         =   "Copy"
  118.          Height          =   405
  119.          Left            =   1440
  120.          TabIndex        =   11
  121.          Top             =   1110
  122.          Width           =   855
  123.       End
  124.       Begin CommandButton cancel_button 
  125.          Caption         =   "Cancel"
  126.          Height          =   405
  127.          Left            =   2340
  128.          TabIndex        =   13
  129.          Top             =   1110
  130.          Width           =   855
  131.       End
  132.       Begin Label Label4 
  133.          BackColor       =   &H00C0C0C0&
  134.          Caption         =   "Rename?"
  135.          Height          =   285
  136.          Left            =   90
  137.          TabIndex        =   25
  138.          Top             =   810
  139.          Width           =   855
  140.       End
  141.       Begin Label Label2 
  142.          BackColor       =   &H00C0C0C0&
  143.          Caption         =   "Copy to:"
  144.          Height          =   255
  145.          Left            =   90
  146.          TabIndex        =   10
  147.          Top             =   480
  148.          Width           =   945
  149.       End
  150.       Begin Label Label1 
  151.          BackColor       =   &H00C0C0C0&
  152.          Caption         =   "Copy from:"
  153.          Height          =   225
  154.          Left            =   90
  155.          TabIndex        =   16
  156.          Top             =   150
  157.          Width           =   945
  158.       End
  159.       Begin Label copy_to 
  160.          BackColor       =   &H00C0C0C0&
  161.          BorderStyle     =   1  'Fixed Single
  162.          Height          =   285
  163.          Left            =   1050
  164.          TabIndex        =   15
  165.          Top             =   450
  166.          Width           =   3495
  167.       End
  168.       Begin Label copy_from 
  169.          BackColor       =   &H00C0C0C0&
  170.          BorderStyle     =   1  'Fixed Single
  171.          Height          =   285
  172.          Left            =   1050
  173.          TabIndex        =   14
  174.          Top             =   150
  175.          Width           =   3495
  176.       End
  177.    End
  178.    Begin SSPanel status_box 
  179.       Align           =   1  'Align Top
  180.       Alignment       =   1  'Left Justify - MIDDLE
  181.       BevelInner      =   1  'Inset
  182.       BorderWidth     =   1
  183.       Height          =   720
  184.       Left            =   0
  185.       TabIndex        =   9
  186.       Top             =   2085
  187.       Width           =   7275
  188.       Begin PictureBox trash 
  189.          AutoSize        =   -1  'True
  190.          Height          =   600
  191.          Left            =   5970
  192.          Picture         =   FTP_FORM.FRX:0302
  193.          ScaleHeight     =   570
  194.          ScaleWidth      =   570
  195.          TabIndex        =   24
  196.          Top             =   60
  197.          Width           =   600
  198.       End
  199.       Begin PictureBox info 
  200.          AutoSize        =   -1  'True
  201.          BackColor       =   &H00C0C0C0&
  202.          Height          =   600
  203.          Left            =   6600
  204.          Picture         =   FTP_FORM.FRX:0D2C
  205.          ScaleHeight     =   570
  206.          ScaleWidth      =   570
  207.          TabIndex        =   23
  208.          Top             =   60
  209.          Width           =   600
  210.       End
  211.       Begin ListBox status_list 
  212.          Height          =   615
  213.          Left            =   45
  214.          TabIndex        =   6
  215.          Top             =   45
  216.          Width           =   4440
  217.       End
  218.    End
  219.    Begin SSPanel rfile_frame 
  220.       Align           =   1  'Align Top
  221.       AutoSize        =   3  'AutoSize Child To Panel
  222.       BevelInner      =   1  'Inset
  223.       BorderWidth     =   1
  224.       Caption         =   "Panel3D1"
  225.       Height          =   810
  226.       Left            =   0
  227.       TabIndex        =   8
  228.       Top             =   495
  229.       Width           =   7275
  230.       Begin Outline lfile 
  231.          DragIcon        =   FTP_FORM.FRX:1756
  232.          Height          =   720
  233.          Left            =   45
  234.          PictureClosed   =   FTP_FORM.FRX:1A58
  235.          PictureLeaf     =   FTP_FORM.FRX:1BB2
  236.          PictureMinus    =   FTP_FORM.FRX:1D0C
  237.          PictureOpen     =   FTP_FORM.FRX:1E66
  238.          PicturePlus     =   FTP_FORM.FRX:1FC0
  239.          TabIndex        =   4
  240.          Top             =   45
  241.          Width           =   7185
  242.       End
  243.    End
  244.    Begin SSPanel drive_frame 
  245.       Align           =   1  'Align Top
  246.       BorderWidth     =   1
  247.       Height          =   495
  248.       Left            =   0
  249.       TabIndex        =   7
  250.       Top             =   0
  251.       Width           =   7275
  252.       Begin SSPanel options_frame 
  253.          Alignment       =   1  'Left Justify - MIDDLE
  254.          BevelOuter      =   1  'Inset
  255.          BorderWidth     =   1
  256.          Caption         =   " Xfer Options"
  257.          Height          =   435
  258.          Left            =   4020
  259.          TabIndex        =   18
  260.          Top             =   30
  261.          Width           =   3225
  262.          Begin CommandButton button_type 
  263.             Caption         =   "ASCII"
  264.             Height          =   375
  265.             Left            =   1230
  266.             TabIndex        =   2
  267.             Top             =   30
  268.             Width           =   975
  269.          End
  270.          Begin CommandButton button_mode 
  271.             Caption         =   "Stream"
  272.             Height          =   375
  273.             Left            =   2220
  274.             TabIndex        =   3
  275.             Top             =   30
  276.             Width           =   975
  277.          End
  278.       End
  279.       Begin SSPanel Panel3D1 
  280.          Alignment       =   1  'Left Justify - MIDDLE
  281.          BevelOuter      =   1  'Inset
  282.          BorderWidth     =   1
  283.          Caption         =   " Local Drive"
  284.          Height          =   435
  285.          Left            =   30
  286.          TabIndex        =   17
  287.          Top             =   30
  288.          Width           =   3945
  289.          Begin DriveListBox Drive1 
  290.             BackColor       =   &H00C0C0C0&
  291.             ForeColor       =   &H00000000&
  292.             Height          =   315
  293.             Left            =   1110
  294.             TabIndex        =   1
  295.             Top             =   60
  296.             Width           =   2775
  297.          End
  298.       End
  299.    End
  300.    Begin SSPanel lfile_frame 
  301.       Align           =   1  'Align Top
  302.       AutoSize        =   3  'AutoSize Child To Panel
  303.       BevelInner      =   1  'Inset
  304.       BorderWidth     =   1
  305.       Caption         =   "Panel3D1"
  306.       Height          =   780
  307.       Left            =   0
  308.       TabIndex        =   0
  309.       Top             =   1305
  310.       Width           =   7275
  311.       Begin Outline rfile 
  312.          DragIcon        =   FTP_FORM.FRX:211A
  313.          Enabled         =   0   'False
  314.          Height          =   690
  315.          Left            =   45
  316.          PathSeparator   =   "/"
  317.          PictureClosed   =   FTP_FORM.FRX:241C
  318.          PictureLeaf     =   FTP_FORM.FRX:2576
  319.          PictureMinus    =   FTP_FORM.FRX:26D0
  320.          PictureOpen     =   FTP_FORM.FRX:282A
  321.          PicturePlus     =   FTP_FORM.FRX:2984
  322.          TabIndex        =   5
  323.          Top             =   45
  324.          Width           =   7185
  325.       End
  326.    End
  327.    Begin Menu menu_file 
  328.       Caption         =   "&File"
  329.       Begin Menu menu_connect 
  330.          Caption         =   "&Connect"
  331.       End
  332.       Begin Menu menu_disconnect 
  333.          Caption         =   "&Disconnect"
  334.       End
  335.       Begin Menu menu_exit 
  336.          Caption         =   "E&xit"
  337.       End
  338.    End
  339.    Begin Menu menu_options 
  340.       Caption         =   "&Options"
  341.       Begin Menu menu_lcl_refresh 
  342.          Caption         =   "&Local Structure Refresh"
  343.       End
  344.       Begin Menu menu_rmt_refresh 
  345.          Caption         =   "&Remote Structure Refresh"
  346.       End
  347.       Begin Menu menu_xfer 
  348.          Caption         =   "&File Transfer"
  349.          Begin Menu menu_type 
  350.             Caption         =   "&Type"
  351.             Begin Menu menu_type_ascii 
  352.                Caption         =   "&ASCII"
  353.                Checked         =   -1  'True
  354.             End
  355.             Begin Menu menu_type_binary 
  356.                Caption         =   "&Binary"
  357.             End
  358.          End
  359.          Begin Menu menu_mode 
  360.             Caption         =   "&Mode"
  361.             Begin Menu menu_mode_stream 
  362.                Caption         =   "&Stream"
  363.                Checked         =   -1  'True
  364.             End
  365.             Begin Menu menu_mode_block 
  366.                Caption         =   "&Block"
  367.             End
  368.             Begin Menu menu_mode_compressed 
  369.                Caption         =   "&Compressed"
  370.                Enabled         =   0   'False
  371.                Visible         =   0   'False
  372.             End
  373.          End
  374.          Begin Menu menu_port_cycle 
  375.             Caption         =   "&Cycle Port Numbers"
  376.             Checked         =   -1  'True
  377.          End
  378.       End
  379.       Begin Menu menu_other 
  380.          Caption         =   "&Status Messages"
  381.          Begin Menu menu_verbose 
  382.             Caption         =   "&Verbose Status"
  383.             Checked         =   -1  'True
  384.          End
  385.       End
  386.    End
  387. End
  388. Const DATA_PORT = 8        ' this value * 256 is data port number
  389. Const MAX_BLKSIZE = 1024   ' maximum data to send in a single request
  390.  
  391. Dim cbuf As String         ' buffer for inbound control messages
  392. Dim dbuf As String         ' buffer for inbound data
  393.  
  394. Dim lfile_path As String
  395. Dim lfile_name As String
  396. Dim rfile_path As String
  397. Dim rfile_name As String
  398.  
  399. Dim data_type As Integer   ' used to control list and copy
  400. Const DT_RECEIVE = 0
  401. Const DT_SEND = 1
  402. Const DT_LIST = 2
  403.  
  404. Dim data_socket As Integer ' 0 - disconnected, not0 - data socket number
  405. Dim data_file As Integer   ' input or output disk file handle
  406.  
  407. Dim txth As Integer        ' height of font in outline boxes
  408.  
  409. ' TELNET negotiation
  410.  
  411. Dim parsedata(10) As Integer
  412. Dim ppno As Integer
  413.  
  414. Dim sw_ugoahead As Integer
  415. Dim sw_igoahead As Integer
  416. Dim sw_echo As Integer
  417. Dim sw_termsent As Integer
  418. Dim substate As Integer
  419.  
  420. Const GO_NORM = 0
  421. Const GO_IAC1 = 1
  422. Const GO_IAC2 = 2
  423. Const GO_IAC3 = 3
  424. Const GO_IAC4 = 4
  425. Const GO_IAC5 = 5
  426. Const GO_IAC6 = 6
  427.  
  428. Const SE = 240
  429. Const SB = 250
  430. Const WILLTEL = 251
  431. Const WONTTEL = 252
  432. Const DOTEL = 253
  433. Const DONTTEL = 254
  434. Const IAC = 255
  435.  
  436. Const ECHO = 1
  437. Const SGA = 3
  438. Const TIMING = 6
  439. Const TERMTYPE = 24
  440. Const NAWS = 31
  441.  
  442. Sub button_mode_Click ()
  443.  
  444.   If button_mode.Caption = "Stream" Then
  445.     menu_mode_block_click
  446.   'ElseIf button_mode.Caption = "Block" Then
  447.   '  menu_mode_compressed_click
  448.   Else
  449.     menu_mode_stream_click
  450.   End If
  451.  
  452. End Sub
  453.  
  454. Sub button_type_Click ()
  455.  
  456.   If button_type.Caption = "ASCII" Then
  457.     menu_type_binary_click
  458.   Else
  459.     menu_type_ascii_click
  460.   End If
  461.  
  462. End Sub
  463.  
  464. Sub cancel_button_Click ()
  465.   
  466.   function_child.Visible = False
  467.   lfile.DragMode = 0
  468.   rfile.DragMode = 0
  469.  
  470. End Sub
  471.  
  472. Function cntl_recv (lowest_return As Integer) As Integer
  473.   
  474.   Do While True
  475.     z = DoEvents() ' let the receive events fire at will
  476.     p = InStr(cbuf, Chr$(10))
  477.     If p Then
  478.       cmsg$ = Left$(cbuf, p - 1)
  479.       cbuf = Right$(cbuf, Len(cbuf) - p)
  480.       status_list.AddItem "<-- " + cmsg$, 0
  481.       If status_list.ListCount = 50 Then
  482.         status_list.RemoveItem 49
  483.       End If
  484.     
  485.       If Mid$(cmsg$, 4, 1) <> "-" Then
  486.         st = Val(Left$(cmsg$, 1))
  487.         If st >= lowest_return Then ' don't pass back intermediate messages
  488.           cntl_recv = st
  489.           Exit Function
  490.         End If
  491.       End If
  492.     End If
  493.   Loop
  494.  
  495. End Function
  496.  
  497. Sub cntl_send (m As String)
  498.   
  499.   If Left$(m, 4) = "PASS" And Mid$(m, 6, 9) <> "anonymous" Then
  500.     If menu_verbose.Checked Then
  501.       log_message "--> PASS *"
  502.     End If
  503.     ftpcntl.Send = m + Chr$(13) + Chr$(10)
  504.   ElseIf Left$(m, 1) = Chr$(255) Then
  505.     ftpcntl.Send = m
  506.   Else
  507.     If menu_verbose.Checked Then
  508.       log_message "--> " + m
  509.     End If
  510.     ftpcntl.Send = m + Chr$(13) + Chr$(10)
  511.   End If
  512.   
  513. End Sub
  514.  
  515. Sub copy_button_Click ()
  516.   
  517.   mousepointer = HOURGLASS
  518.  
  519.   function_child.Visible = False
  520.   lfile.DragMode = 0
  521.   rfile.DragMode = 0
  522.  
  523.   transfer_child.Left = (ftp_form.Width - transfer_child.Width) / 2
  524.   transfer_child.Top = drive1.Height + 500
  525.   transfer_child.Visible = True
  526.   copy_file
  527.   transfer_child.Visible = False
  528.   mousepointer = DEFAULT
  529.  
  530. End Sub
  531.  
  532. Sub copy_file ()
  533.   
  534. Dim filesize As Long
  535. Dim todo As Long
  536. Dim sofar As Long
  537. Dim every10 As Integer
  538.  
  539.   If button_type.Caption = "ASCII" Then
  540.     cntl_send "TYPE A"
  541.   Else
  542.     cntl_send "TYPE I"
  543.   End If
  544.   If 2 <> cntl_recv(2) Then
  545.     Exit Sub
  546.   End If
  547.  
  548.   If button_mode.Caption = "Stream" Then
  549.     cntl_send "MODE S"
  550.   ElseIf button_mode.Caption = "Block" Then
  551.     cntl_send "MODE B"
  552.   Else
  553.     cntl_send "MODE C"
  554.   End If
  555.   If 2 <> cntl_recv(2) Then
  556.     Exit Sub
  557.   End If
  558.  
  559.   open_data_port
  560.   If 2 <> cntl_recv(2) Then
  561.     Exit Sub
  562.   End If
  563.  
  564.   On Error GoTo recover
  565.  
  566.   Select Case data_type
  567.     Case DT_RECEIVE
  568.       pct_cmpl.Visible = False
  569.       pct_box.Visible = False
  570.       data_file = FreeFile
  571.       Open lfile_path + "/" + Trim$(copy_rename.Text) For Output As data_file
  572.       cntl_send "RETR " + rfile_path
  573.       st = cntl_recv(1)           ' wait for starting... message
  574.       If 1 = st Then
  575.         If 2 <> cntl_recv(2) Then ' wait for finished... message
  576.           Close data_file
  577.           Exit Sub
  578.         End If
  579.       ElseIf 2 <> st Then
  580.         Close data_file
  581.         Exit Sub
  582.       End If
  583.       
  584.       Do While data_socket <> 0   ' wait for server to close
  585.         z = DoEvents()
  586.       Loop
  587.       
  588.     Case DT_SEND
  589.       pct_cmpl.Width = 0
  590.       pct_box.Visible = True
  591.       pct_cmpl.Visible = True
  592.       cntl_send "STOR " + rfile_path + "/" + Trim$(copy_rename.Text)
  593.       If 1 <> cntl_recv(1) Then
  594.         Close data_file
  595.         Exit Sub
  596.       End If
  597.       Do While data_socket = 0    ' wait for server to connect
  598.         z = DoEvents()
  599.       Loop
  600.       
  601.       If button_type.Caption = "ASCII" Then
  602.         data_file = FreeFile
  603.         Open lfile_path For Input As data_file
  604.         filesize = LOF(data_file)
  605.         Do While Not EOF(data_file)
  606.           If transfer_child.Visible = False Then
  607.             Close data_file
  608.             Exit Sub
  609.           End If
  610.           Line Input #data_file, blk$
  611.           If Len(blk$) > MAX_BLKSIZE Then
  612.             Close data_file
  613.             MsgBox "Line exceed FTP buffer size, use BINARY transfer"
  614.             cntl_send "ABOR"
  615.             Do While 2 <> cntl_recv(2): Loop
  616.             Exit Do
  617.           End If
  618.           blk$ = blk$ + Chr$(13) + Chr$(10)
  619.           GoSub send_block
  620.         Loop
  621.       Else
  622.         data_file = FreeFile
  623.         Open lfile_path For Binary Access Read As data_file Len = MAX_BLKSIZE
  624.         filesize = LOF(data_file)
  625.         todo = filesize
  626.         Do While todo > 0
  627.           If transfer_child.Visible = False Then
  628.             Close data_file
  629.             Exit Sub
  630.           End If
  631.           If todo >= MAX_BLKSIZE Then
  632.             blk$ = String$(MAX_BLKSIZE, 0)
  633.             todo = todo - MAX_BLKSIZE
  634.           Else
  635.             blk$ = String$(doto, 0)
  636.             todo = 0
  637.           End If
  638.           Get data_file, , blk$
  639.           GoSub send_block
  640.         Loop
  641.       End If
  642.       Select Case button_mode.Caption
  643.         Case "Stream"
  644.         Case "Block"
  645.           ftpdata(data_socket).Send = Chr$(64) + Chr$(0) + Chr$(0)
  646.         Case "Compress"
  647.           ' some day, maybe
  648.       End Select
  649.       
  650.       ftpdata(data_socket).Open = False ' tell server we're done
  651.       z = cntl_recv(2)
  652.       Do While 0 <> data_socket
  653.         z = DoEvents()
  654.       Loop
  655.  
  656.   End Select
  657.  
  658.   Close data_file
  659.   Exit Sub
  660.  
  661. send_block:
  662.       
  663.   ln = Len(blk$)
  664.   Select Case button_mode.Caption
  665.     Case "Stream"
  666.       ftpdata(data_socket).Send = blk$
  667.     Case "Block"
  668.       If button_type.Caption = "ASCII" Then
  669.         hdr$ = Chr$(128)
  670.       Else
  671.         hdr$ = Chr$(0)
  672.       End If
  673.       hdr$ = hdr$ + Chr$(ln / 256) + Chr$(ln And &HFF)
  674.       ftpdata(data_socket).Send = hdr$ + blk$
  675.     Case "Compress"
  676.       ' some day, maybe
  677.   End Select
  678.   
  679.   sofar = sofar + ln
  680.   every10 = every10 + 1
  681.   If every10 > 9 Then
  682.     every10 = 0
  683.     pct_cmpl.Width = pct_box.Width * (sofar / filesize)
  684.   End If
  685.  
  686.   blk$ = ""
  687.   
  688.   Return
  689.  
  690. recover:
  691.   
  692.   MsgBox "Error" + Str$(Err) + " encountered during copy, copy cancelled"
  693.   ftpdata(data_socket).Open = False
  694.   Do While data_socket <> 0
  695.     z = DoEvents()
  696.   Loop
  697.   Close data_file
  698.   Exit Sub
  699.  
  700. End Sub
  701.  
  702. Sub Drive1_Change ()
  703.  
  704.   ChDrive drive1.List(drive1.ListIndex)
  705.   local_dir True
  706.  
  707. End Sub
  708.  
  709. Sub Form_Load ()
  710.   
  711. Dim ln As String * 80
  712. Dim nm As String
  713.  
  714.   FontName = lfile.FontName
  715.   FontSize = lfile.FontSize
  716.   txth = TextHeight("A")
  717.   
  718.   z = GetINIString("Settings", "Verbose", "", ln, 80, "vtftp.ini")
  719.   menu_verbose.Checked = Val(ln)
  720.   
  721.   z = GetINIString("Settings", "CyclePort", "", ln, 80, "vtftp.ini")
  722.   menu_port_cycle.Checked = Val(ln)
  723.   
  724.   For X = 1 To 99
  725.     nm = "IP" + Trim$(Str$(X))
  726.     lnsz = GetINIString("FTP Sites", nm, "", ln, 80, "vtftp.ini")
  727.     If lnsz > 0 Then
  728.       connect_form.conn_ipname.AddItem Trim$(ln)
  729.     End If
  730.   Next X
  731.   
  732.   local_dir True
  733.  
  734. End Sub
  735.  
  736. Sub Form_Resize ()
  737.  
  738.   If ftp_form.Width < 7395 Then
  739.     ftp_form.Width = 7395
  740.   End If
  741.   
  742.   h = (ftp_form.Height - (drive_frame.Height + status_box.Height)) / 2 - 350
  743.   lfile_frame.Height = h
  744.   rfile_frame.Height = h
  745.  
  746.   status_list.Height = status_box.Height - 25
  747.   status_list.Width = ftp_form.Width - 1500
  748.   info.Left = ftp_form.Width - (info.Width + 200)
  749.   trash.Left = info.Left - (trash.Width + 25)
  750.  
  751. End Sub
  752.  
  753. Sub Form_Unload (Cancel As Integer)
  754.  
  755.   menu_exit_click
  756.  
  757. End Sub
  758.  
  759. Sub ftpcntl_Recv ()
  760.  
  761. Static cmd As Integer
  762.  
  763. Dim X As Integer
  764. Dim s, ch As String
  765.  
  766.   s = ftpcntl.Recv
  767.   For X = 1 To Len(s)
  768.     ch = Mid$(s, X, 1)
  769.     Select Case cmd
  770.       Case GO_NORM
  771.         If ch = Chr$(IAC) Then
  772.           cmd = GO_IAC1
  773.         ElseIf ch = Chr$(13) Or ch = Chr$(31) Then ' skip LF's to keep things simple
  774.         Else
  775.           cbuf = cbuf + ch
  776.         End If
  777.       Case GO_IAC1
  778.         cmd = iac1(ch)
  779.       Case GO_IAC2
  780.         cmd = iac2(ch)
  781.       Case GO_IAC3
  782.         cmd = iac3(ch)
  783.       Case GO_IAC4
  784.         cmd = iac4(ch)
  785.       Case GO_IAC5
  786.         cmd = iac5(ch)
  787.       Case GO_IAC6
  788.         cmd = iac6(ch)
  789.       Case Else
  790.         MsgBox "Invalid 'next (" + Str$(cmd) + ")' processing routine in cmd loop"
  791.     End Select
  792.   Next X
  793.   
  794. End Sub
  795.  
  796. Sub ftpdata_Connect (index As Integer, ID As Integer)
  797.  
  798.   Load ftpdata(ID)
  799.   data_socket = ID
  800.  
  801.   log_message "     Data Port Connected (" + Trim$(Str$(ID)) + ")"
  802.  
  803. End Sub
  804.  
  805. Sub ftpdata_Disconnect (index As Integer)
  806.  
  807.   log_message "     Data Port Disconnected (" + Trim$(Str$(index)) + ")"
  808.   
  809.   If ftpdata(index).Open Then
  810.     ftpdata(index).Open = False
  811.   End If
  812.   data_socket = 0
  813.   Unload ftpdata(index)
  814.  
  815. End Sub
  816.  
  817. Sub ftpdata_Recv (index As Integer)
  818.  
  819. Dim c As Integer
  820. Dim l As Integer
  821.   
  822.   Select Case data_type
  823.     Case DT_RECEIVE
  824.       Select Case button_mode.Caption
  825.         Case "Stream"
  826.           blk$ = ftpdata(index).Recv
  827.           Do While blk$ <> ""
  828.             Print #data_file, blk$;
  829.             blk$ = ftpdata(index).Recv
  830.           Loop
  831.         Case "Block"
  832.           blk$ = ftpdata(index).Recv
  833.           Do While blk$ <> ""
  834.             c = Asc(Left$(blk$, 1))
  835.             l = Asc(Mid$(blk$, 2, 1)) * 256 + Asc(Mid$(blk$, 3, 1))
  836.             If l Then
  837.               Print #data_file, Mid$(blk$, 3, l);
  838.             End If
  839.             If c And 128 Then  ' end of record
  840.               Print #data_file,
  841.             End If
  842.             If c And 64 Then   ' end of file
  843.               blk$ = ""
  844.               ftpdata(index).Open = False
  845.             Else
  846.               blk$ = Right$(blk$, Len(blk$) - 3) + ftpdata(index).Recv
  847.             End If
  848.           Loop
  849.         Case "Compress"
  850.           ' add decompression logic here
  851.       End Select
  852.     Case DT_SEND
  853.       MsgBox ("ERROR:  INBOUND data received on OUTBOUND connection")
  854.     Case DT_LIST
  855.       dbuf = dbuf + ftpdata(index).Recv
  856.   End Select
  857.  
  858. End Sub
  859.  
  860. Function iac1 (ch As String) As Integer
  861.       
  862.   iac1 = GO_NORM
  863.   
  864.   Select Case Asc(ch)
  865.     Case DOTEL
  866.       Debug.Print "DO ";
  867.       iac1 = GO_IAC2
  868.     Case DONTTEL
  869.       Debug.Print "DONT "
  870.     Case WILLTEL
  871.       Debug.Print "WILL ";
  872.       iac1 = GO_IAC3
  873.     Case WONTTEL
  874.       Debug.Print "WONT ";
  875.       iac1 = GO_IAC4
  876.     Case SB
  877.       Debug.Print "SB ";
  878.       iac1 = GO_IAC5
  879.       pno = 0
  880.       substate = 0
  881.     Case SE
  882.       Debug.Print "SE "
  883.       ' End of negotiation string, string is in parsedata()
  884.       Select Case parsedata(0)
  885.         Case TERMTYPE
  886.           If parsedata(1) = 1 Then
  887.             Debug.Print "SENT: SB TERMTYPE VT100"
  888.             ftp_form.ftpcntl.Send = Chr$(IAC) + Chr$(SB) + Chr$(TERMTYPE) + "vt100" + Chr$(0) + Chr$(IAC) + Chr$(SE)
  889.           End If
  890.       End Select
  891.   End Select
  892.   
  893. End Function
  894.  
  895. Function iac2 (ch As String) As Integer
  896.       
  897.   'DO Processing
  898.   
  899.   iac2 = GO_NORM
  900.  
  901.   Select Case Asc(ch)
  902.     Case SGA
  903.       Debug.Print "SGA"
  904.       If Not sw_igoahead Then
  905.         ftp_form.ftpcntl.Send = Chr$(IAC) + Chr$(WILLTEL) + Chr$(SGA)
  906.         sw_igoahead = True
  907.       End If
  908.     Case TERMTYPE
  909.       Debug.Print "TERMTYPE"
  910.       If Not sw_termsent Then
  911.         sw_termsent = True
  912.         ftp_form.ftpcntl.Send = Chr$(IAC) + Chr$(WILLTEL) + Chr$(TERMTYPE)
  913.       End If
  914.     Case NAWS
  915.       Debug.Print "NAWS"
  916.       ftp_form.ftpcntl.Send = Chr$(IAC) + Chr$(SB) + Chr$(NAWS) + Chr$(0) + Chr$(80) + Chr$(0) + Chr$(24) + Chr$(IAC) + Chr$(SE)
  917.     Case Else
  918.       Debug.Print "OTHER"
  919.       ftp_form.ftpcntl.Send = Chr$(IAC) + Chr$(WONTTEL) + ch
  920.   End Select
  921.  
  922. End Function
  923.  
  924. Function iac3 (ch As String) As Integer
  925.       
  926.   ' WILL Processing
  927.   
  928.   iac3 = GO_NORM
  929.       
  930.   Select Case Asc(ch)
  931.     Case SGA
  932.       Debug.Print "SGA"
  933.       If Not sw_ugoahead Then
  934.         sw_ugoahead = True
  935.         ftp_form.ftpcntl.Send = Chr$(IAC) + Chr$(DOTEL) + Chr$(SGA)
  936.         Debug.Print "SENT: DO SGA"
  937.       End If
  938.     Case ECHO
  939.       Debug.Print "ECHO"
  940.       If Not sw_echo Then
  941.         sw_echo = True
  942.         ftp_form.ftpcntl.Send = Chr$(IAC) + Chr$(DOTEL) + Chr$(ECHO)
  943.         Debug.Print "SENT: DO ECHO"
  944.       End If
  945.     Case TIMING
  946.       Debug.Print "TIMING"
  947.       sw_timing = 0
  948.     Case Else
  949.       Debug.Print "SENT:  DONT OTHER"
  950.       ftp_form.ftpcntl.Send = Chr$(IAC) + Chr$(DONTTEL) + ch
  951.   End Select
  952.  
  953. End Function
  954.  
  955. Function iac4 (ch As String) As Integer
  956.  
  957.   ' WONT Processing
  958.   
  959.   iac4 = GO_NORM
  960.   
  961.   Select Case Asc(ch)
  962.     Case ECHO
  963.       Debug.Print "ECHO"
  964.       If sw_echo Then
  965.         sw_echo = False
  966.         ftp_form.ftpcntl.Send = Chr$(IAC) + Chr$(DONTTEL) + Chr$(ECHO)
  967.         Debug.Print "SENT: DONT ECHO"
  968.       End If
  969.     Case TIMING
  970.       Debug.Print "TIMING"
  971.       sw_timing = 0
  972.     Case Else
  973.       Debug.Print "SENT: DONT OTHER"
  974.       ftp_form.ftpcntl.Send = Chr$(IAC) + Chr$(DONT) + ch
  975.   End Select
  976.  
  977. End Function
  978.  
  979. Function iac5 (ch As String) As Integer
  980.  
  981.   ' Collect parms after SB and until another IAC
  982.   
  983.   ich = Asc(ch)
  984.   
  985.   If ich = IAC Then
  986.     iac5 = GO_IAC1
  987.     Exit Function
  988.   End If
  989.  
  990.   Debug.Print "SUBPARM ";
  991.   parsedata(ppno) = ich
  992.   ppno = ppno + 1
  993.  
  994.   iac5 = GO_IAC5
  995.  
  996. End Function
  997.  
  998. Function iac6 (ch As String) As Integer
  999.   
  1000.   ' End of negotiation string, string is in parsedata()
  1001.  
  1002.   Select Case parsedata(0)
  1003.     Case TERMTYPE
  1004.       If parsedata(1) = 1 Then
  1005.         Debug.Print "SENT: SB TERMTYPE VT100"
  1006.         ftp_form.ftpcntl.Send = Chr$(IAC) + Chr$(SB) + Chr$(TERMTYPE) + "vt100" + Chr$(0) + Chr$(IAC) + Chr$(SE)
  1007.       End If
  1008.   End Select
  1009.  
  1010. End Function
  1011.  
  1012. Sub info_DragDrop (Source As Control, X As Single, Y As Single)
  1013.  
  1014. Dim p1, p2 As Integer
  1015.  
  1016.   If Source = lfile Then
  1017.     log_message "        Date/Time: " + FileDateTime(lfile_path) + " Size:" + Str$(FileLen(lfile_path))
  1018.     log_message "INFO for " + lfile_path
  1019.   ElseIf Source = rfile Then
  1020.     mousepointer = HOURGLASS
  1021.     rfile.Enabled = False
  1022.     dbuf = ""
  1023.     open_data_port
  1024.     If 2 <> cntl_recv(2) Then
  1025.       mousepointer = DEFAULT
  1026.       rfile.Enabled = True
  1027.       Exit Sub
  1028.     End If
  1029.     data_type = DT_LIST
  1030.     cntl_send "LIST " + rfile_path
  1031.     If 2 <> cntl_recv(2) Then
  1032.       mousepointer = DEFAULT
  1033.       rfile.Enabled = True
  1034.       Exit Sub
  1035.     End If
  1036.     
  1037.     Do While data_socket <> 0
  1038.       z = DoEvents()
  1039.     Loop
  1040.     ' dbuf now contains the file list
  1041.     log_message "     " + Left$(dbuf, Len(dbuf) - 2)
  1042.     log_message "INFO for " + rfile_path
  1043.   
  1044.     rfile.Enabled = True
  1045.     mousepointer = DEFAULT
  1046.   End If
  1047.   
  1048.   lfile.DragMode = 0
  1049.   rfile.DragMode = 0
  1050.  
  1051. End Sub
  1052.  
  1053. Sub lfile_DblClick ()
  1054.  
  1055. Dim i As Integer
  1056.  
  1057.   i = lfile.ListIndex
  1058.   If i < 1 Then
  1059.     Exit Sub
  1060.   End If
  1061.  
  1062.   If lfile.PictureType(i) = 0 Then
  1063.     local_dir i
  1064.   End If
  1065.  
  1066. End Sub
  1067.  
  1068. Sub lfile_DragDrop (Source As Control, X As Single, Y As Single)
  1069.  
  1070. Dim i As Integer
  1071.  
  1072.   If Source = rfile Then
  1073.     i = lfile.TopIndex + (Y / txth) - 1
  1074.     If i < 0 Or i > lfile.ListCount - 1 Then
  1075.       Exit Sub
  1076.     End If
  1077.     lfile.ListIndex = i
  1078.     'only allow drop into a directory
  1079.     If rfile.PictureType(i) = 0 Then
  1080.       lfile_path = lfile.FullPath(i)
  1081.       lfile_name = ""
  1082.       data_type = DT_RECEIVE
  1083.       copy_from.Caption = rfile_path
  1084.       copy_to.Caption = lfile_path + "\" + rfile_name
  1085.       copy_rename.Text = rfile_name
  1086.       function_child.Left = 1500
  1087.       function_child.Top = drive1.Height + Y - (function_child.Height / 3)
  1088.       function_child.Visible = True
  1089.     Else
  1090.       MsgBox "Can't copy to a file, drop onto a directory"
  1091.       lfile.DragMode = 0
  1092.       rfile.DragMode = 0
  1093.     End If
  1094.   End If
  1095.  
  1096. End Sub
  1097.  
  1098. Sub lfile_PictureClick (ListIndex As Integer)
  1099.  
  1100.   lfile.ListIndex = ListIndex
  1101.   If lfile.PictureType(ListIndex) = 2 Then
  1102.     lfile_path = lfile.FullPath(ListIndex)
  1103.     lfile_name = lfile.List(ListIndex)
  1104.     lfile.DragMode = 1
  1105.   End If
  1106.  
  1107. End Sub
  1108.  
  1109. Sub local_dir (i As Integer)
  1110.  
  1111. Dim idt As Integer
  1112. Dim isave As Integer
  1113.  
  1114.   mousepointer = HOURGLASS
  1115.   lfile.Enabled = False
  1116.  
  1117.  
  1118.   If i < 0 Then
  1119.     ChDir "\"
  1120.     lfile.Clear
  1121.     lfile.AddItem Left$(CurDir$, 2), 0
  1122.     lfile.Indent(0) = 1
  1123.     isave = 0
  1124.     i = 0
  1125.     idt = 1
  1126.   Else
  1127.     ChDir lfile.FullPath(i)
  1128.     isave = i
  1129.     idt = lfile.Indent(i)
  1130.   End If
  1131.  
  1132.   i = i + 1
  1133.   n$ = Dir$("*.*", 16)
  1134.   Do While n$ <> ""
  1135.     If Left$(n$, 1) <> "." Then
  1136.       If GetAttr(n$) = 16 Then
  1137.         lfile.AddItem n$, i
  1138.         lfile.Indent(i) = idt + 1
  1139.         lfile.PictureType(i) = 0
  1140.         i = i + 1
  1141.       End If
  1142.     End If
  1143.     n$ = Dir$
  1144.   Loop
  1145.   
  1146.   n$ = Dir$("*.*", 7)
  1147.   Do While n$ <> ""
  1148.     lfile.AddItem n$, i
  1149.     lfile.Indent(i) = idt + 1
  1150.     lfile.PictureType(i) = 2
  1151.     n$ = Dir$
  1152.     i = i + 1
  1153.   Loop
  1154.  
  1155.   lfile.Expand(isave) = True
  1156.  
  1157.   lfile.Enabled = True
  1158.   mousepointer = DEFAULT
  1159.  
  1160. End Sub
  1161.  
  1162. Sub log_message (msg As String)
  1163.       
  1164.   status_list.AddItem msg, 0
  1165.   If status_list.ListCount = 50 Then
  1166.     status_list.RemoveItem 49
  1167.   End If
  1168.  
  1169. End Sub
  1170.  
  1171. Sub logoff ()
  1172.   
  1173.   rfile.Clear
  1174.   rfile.Enabled = False
  1175.  
  1176.   If data_socket Then
  1177.     cntl_send Chr$(255) + Chr$(244) + "ABOR"
  1178.     ftpdata(data_socket).Open = False
  1179.   End If
  1180.  
  1181.   If ftpdata(0).Open Then
  1182.     ftpdata(0).Open = False
  1183.   End If
  1184.   
  1185.   If ftpcntl.Open Then
  1186.     cntl_send Chr$(255) + Chr$(244) + "QUIT"
  1187.     ftpcntl.Open = False
  1188.   End If
  1189.  
  1190. End Sub
  1191.  
  1192. Function logon () As Integer
  1193.   
  1194. Dim st As Integer
  1195.  
  1196.   logon = 2 ' assume we succeed
  1197.  
  1198.   If ftpcntl.Open Then
  1199.     Exit Function
  1200.   End If
  1201.  
  1202.   ftpcntl.IPName = IPName
  1203.   ftpcntl.Port = 21
  1204.  
  1205.   On Error Resume Next
  1206.   ftpcntl.Open = True
  1207.   If Err Then
  1208.     MsgBox "Host connection failed with WinSock code " + Str$(Err)
  1209.     logon = 5
  1210.     Exit Function
  1211.   End If
  1212.  
  1213.   ' wait for FTP host to send welcome (220) message
  1214.   
  1215.   Do While 2 <> cntl_recv(2): Loop
  1216.  
  1217.   cntl_send "USER " + userid
  1218.   st = cntl_recv(2)
  1219.   If st <> 3 Then
  1220.     logon = st
  1221.     Exit Function
  1222.   End If
  1223.   
  1224.   If LCase$(Trim$(userid)) = "anonymous" Then
  1225.     ip = ftpcntl.MyIP
  1226.     For X = 1 To 4
  1227.       r$ = Trim$(Str$(ip And 255)) + "." + r$
  1228.       ip = ip / 256
  1229.     Next X
  1230.     password = "anonymous@" + Left$(r$, Len(r$) - 1)
  1231.   End If
  1232.  
  1233.   cntl_send "PASS " + password
  1234.   st = cntl_recv(2)
  1235.   If st = 3 Then
  1236.     cntl_send "ACCT " + account
  1237.     st = cntl_recv(2)
  1238.     If st <> 2 Then
  1239.       logon = st
  1240.       Exit Function
  1241.     End If
  1242.   ElseIf st <> 2 Then
  1243.     logon = st
  1244.     Exit Function
  1245.   End If
  1246.  
  1247.   rfile.Enabled = True
  1248.  
  1249. End Function
  1250.  
  1251. Sub menu_connect_Click ()
  1252.  
  1253.   mousepointer = HOURGLASS
  1254.  
  1255.   status_list.Clear
  1256.   logoff
  1257.   
  1258.   connect_form.Show 1
  1259.   If IPName = "" Then
  1260.     mousepointer = DEFAULT
  1261.     Exit Sub
  1262.   End If
  1263.  
  1264.   If 2 = logon() Then ' should always end up with 2 on logon
  1265.     rmt_dir True
  1266.   Else
  1267.     logoff
  1268.   End If
  1269.  
  1270.   mousepointer = DEFAULT
  1271.  
  1272. End Sub
  1273.  
  1274. Sub menu_disconnect_Click ()
  1275.   
  1276.   mousepointer = HOURGLASS
  1277.   
  1278.   logoff
  1279.   'status_list.Clear
  1280.  
  1281.   mousepointer = DEFAULT
  1282.  
  1283. End Sub
  1284.  
  1285. Sub menu_exit_click ()
  1286.  
  1287. Dim ln As String * 80
  1288. Dim nm As String
  1289.  
  1290.   mousepointer = HOURGLASS
  1291.  
  1292.   logoff
  1293.  
  1294.   ln = Str$(menu_verbose.Checked)
  1295.   z = PutINIString("Settings", "Verbose", ln, "vtftp.ini")
  1296.   
  1297.   ln = Str$(menu_port_cycle.Checked)
  1298.   z = PutINIString("Settings", "CyclePort", ln, "vtftp.ini")
  1299.   
  1300.   For X = 1 To 99
  1301.     nm = "IP" + Trim$(Str$(X))
  1302.     If X <= connect_form.conn_ipname.ListCount Then
  1303.       ln = connect_form.conn_ipname.List(X - 1)
  1304.       z = PutINIString("FTP Sites", nm, ByVal ln, "vtftp.ini")
  1305.     Else
  1306.       z = PutINIString("FTP Sites", nm, 0&, "vtftp.ini")
  1307.     End If
  1308.   Next X
  1309.   
  1310.   End
  1311.  
  1312. End Sub
  1313.  
  1314. Sub menu_lcl_refresh_Click ()
  1315.  
  1316.   local_dir True
  1317.  
  1318. End Sub
  1319.  
  1320. Sub menu_mode_block_click ()
  1321.  
  1322.   menu_mode_block.Checked = True
  1323.   menu_mode_compressed.Checked = False
  1324.   menu_mode_stream.Checked = False
  1325.  
  1326.   button_mode.Caption = "Block"
  1327.  
  1328. End Sub
  1329.  
  1330. Sub menu_mode_compressed_click ()
  1331.  
  1332.   menu_mode_block.Checked = False
  1333.   menu_mode_compressed.Checked = True
  1334.   menu_mode_stream.Checked = False
  1335.  
  1336.   button_mode.Caption = "Compress"
  1337.  
  1338. End Sub
  1339.  
  1340. Sub menu_mode_stream_click ()
  1341.  
  1342.   menu_mode_block.Checked = False
  1343.   menu_mode_compressed.Checked = False
  1344.   menu_mode_stream.Checked = True
  1345.  
  1346.   button_mode.Caption = "Stream"
  1347.  
  1348. End Sub
  1349.  
  1350. Sub menu_port_cycle_Click ()
  1351.  
  1352.   If menu_port_cycle.Checked Then
  1353.     menu_port_cycle.Checked = False
  1354.   Else
  1355.     menu_port_cycle.Checked = True
  1356.   End If
  1357.  
  1358. End Sub
  1359.  
  1360. Sub menu_rmt_refresh_Click ()
  1361.  
  1362.   If ftpcntl.Open Then
  1363.     rmt_dir True
  1364.   Else
  1365.     MsgBox "Can't refresh an unopened file structure"
  1366.   End If
  1367.  
  1368. End Sub
  1369.  
  1370. Sub menu_type_ascii_click ()
  1371.  
  1372.   menu_type_binary.Checked = False
  1373.   menu_type_ascii.Checked = True
  1374.  
  1375.   button_type.Caption = "ASCII"
  1376.    
  1377. End Sub
  1378.  
  1379. Sub menu_type_binary_click ()
  1380.    
  1381.   menu_type_binary.Checked = True
  1382.   menu_type_ascii.Checked = False
  1383.  
  1384.   button_type.Caption = "Binary"
  1385.  
  1386. End Sub
  1387.  
  1388. Sub menu_verbose_Click ()
  1389.  
  1390.   If menu_verbose.Checked Then
  1391.     menu_verbose.Checked = False
  1392.   Else
  1393.     menu_verbose.Checked = True
  1394.   End If
  1395.  
  1396. End Sub
  1397.  
  1398. Sub open_data_port ()
  1399.  
  1400. Static Port As Integer
  1401. Dim ip As Long
  1402. Dim X As Integer
  1403.  
  1404.   ip = ftpcntl.MyIP
  1405.   For X = 1 To 4
  1406.     r$ = Trim$(Str$(ip And 255)) + "," + r$
  1407.     ip = Int(ip / 256)
  1408.   Next X
  1409.   
  1410.   If data_socket <> 0 Then
  1411.     ftpdata(data_socket).Open = False
  1412.   End If
  1413.   
  1414.   Do While data_socket <> 0
  1415.     z = DoEvents()
  1416.   Loop
  1417.   
  1418.   If Port > 10 Then
  1419.     Port = 0
  1420.   End If
  1421.   
  1422.   If menu_port_cycle.Checked Then
  1423.     Port = Port + 1
  1424.   End If
  1425.  
  1426.   If ftpdata(0).Open Then
  1427.     ftpdata(0).Open = False
  1428.   End If
  1429.   
  1430.   ftpdata(0).Port = DATA_PORT * 256 + Port
  1431.   ftpdata(0).Open = True
  1432.   
  1433.   cntl_send "PORT " + r$ + Trim$(Str$(DATA_PORT)) + "," + Trim$(Str$(Port))
  1434.   
  1435. End Sub
  1436.  
  1437. Sub rfile_DblClick ()
  1438.  
  1439. Dim i As Integer
  1440.  
  1441.   i = rfile.ListIndex
  1442.   If i < 1 Then
  1443.     Exit Sub
  1444.   End If
  1445.  
  1446.   If rfile.PictureType(i) = 0 Then
  1447.     rmt_dir i
  1448.   End If
  1449.  
  1450. End Sub
  1451.  
  1452. Sub rfile_DragDrop (Source As Control, X As Single, Y As Single)
  1453.  
  1454. Dim i As Integer
  1455.  
  1456.   If Source = lfile Then
  1457.     i = rfile.TopIndex + (Y / txth) - 1
  1458.     If i < 0 Or i > lfile.ListCount - 1 Then
  1459.       Exit Sub
  1460.     End If
  1461.     rfile.ListIndex = i
  1462.     ' only allow drop into a directory
  1463.     If rfile.PictureType(i) = 0 Then
  1464.       rfile_path = Right$(rfile.FullPath(i), Len(rfile.FullPath(i)) - 1)
  1465.       rfile_name = ""
  1466.       data_type = DT_SEND
  1467.       copy_from.Caption = lfile_path
  1468.       copy_to.Caption = rfile_path + "/" + lfile_name
  1469.       copy_rename.Text = lfile_name
  1470.       function_child.Left = 1500
  1471.       function_child.Top = drive1.Height + lfile.Height + Y - (function_child.Height / 3)
  1472.       function_child.Visible = True
  1473.     Else
  1474.       MsgBox "Can't copy to a file, drop onto a directory"
  1475.       lfile.DragMode = 0
  1476.       rfile.DragMode = 0
  1477.     End If
  1478.   End If
  1479.  
  1480. End Sub
  1481.  
  1482. Sub rfile_PictureClick (ListIndex As Integer)
  1483.  
  1484.   rfile.ListIndex = ListIndex
  1485.   If rfile.PictureType(ListIndex) = 2 Then
  1486.     rfile_path = Right$(rfile.FullPath(ListIndex), Len(rfile.FullPath(ListIndex)) - 1)
  1487.     rfile_name = rfile.List(ListIndex)
  1488.     rfile.DragMode = 1
  1489.   End If
  1490.  
  1491. End Sub
  1492.  
  1493. Sub rmt_dir (i As Integer)
  1494.  
  1495. Dim idt As Integer
  1496. Dim p1 As Integer
  1497. Dim p2 As Integer
  1498. Dim isave As Integer
  1499.  
  1500.   mousepointer = HOURGLASS
  1501.   rfile.Enabled = False
  1502.  
  1503.   dbuf = ""
  1504.   
  1505.   open_data_port ' establishes listening data connection
  1506.   If 2 <> cntl_recv(2) Then
  1507.     mousepointer = DEFAULT
  1508.     rfile.Enabled = True
  1509.     Exit Sub
  1510.   End If
  1511.     
  1512.   data_type = DT_LIST
  1513.   If i < 0 Then
  1514.     cntl_send "CWD /"
  1515.     If 2 <> cntl_recv(2) Then
  1516.       mousepointer = DEFAULT
  1517.       rfile.Enabled = True
  1518.       Exit Sub
  1519.     End If
  1520.     cntl_send "LIST"
  1521.     If 2 <> cntl_recv(2) Then
  1522.       mousepointer = DEFAULT
  1523.       rfile.Enabled = True
  1524.       Exit Sub
  1525.     End If
  1526.     rfile.Clear
  1527.     rfile.AddItem "/", 0
  1528.     rfile.Indent(0) = 1
  1529.     isave = 0
  1530.     i = 0
  1531.     idt = 1
  1532.   Else
  1533.     cntl_send "LIST " + Right$(rfile.FullPath(i), Len(rfile.FullPath(i)) - 1)
  1534.     If 2 <> cntl_recv(2) Then
  1535.       mousepointer = DEFAULT
  1536.       rfile.Enabled = True
  1537.       Exit Sub
  1538.     End If
  1539.     isave = i
  1540.     idt = rfile.Indent(i)
  1541.   End If
  1542.  
  1543.   Do While data_socket <> 0
  1544.     z = DoEvents()
  1545.   Loop
  1546.  
  1547.   ' dbuf now contains the complete directory list
  1548.   
  1549.   i = i + 1
  1550.   
  1551.   ' first pass is for directories only
  1552.   
  1553.   p1 = 1
  1554.   p2 = 1
  1555.   Do While p2 > 0
  1556.     p2 = InStr(p1, dbuf, Chr$(10))
  1557.     If p2 > 0 Then
  1558.       ln$ = Mid$(dbuf, p1, p2 - p1)
  1559.       If Left$(ln$, 1) = "d" Then
  1560.         n$ = Trim$(Mid$(ln$, 55, Len(ln$) - 55))
  1561.         rfile.AddItem n$, i
  1562.         rfile.Indent(i) = idt + 1
  1563.         rfile.PictureType(i) = 0
  1564.         i = i + 1
  1565.       End If
  1566.     End If
  1567.     p1 = p2 + 1
  1568.   Loop
  1569.   
  1570.   ' make a second pass for files only
  1571.   
  1572.   p1 = 1
  1573.   p2 = 1
  1574.   Do While p2 > 0
  1575.     p2 = InStr(p1, dbuf, Chr$(10))
  1576.     If p2 > 0 Then
  1577.       ln$ = Mid$(dbuf, p1, p2 - p1)
  1578.       If Left$(ln$, 1) = "-" Then
  1579.         n$ = Trim$(Mid$(ln$, 55, Len(ln$) - 55))
  1580.         rfile.AddItem n$, i
  1581.         rfile.Indent(i) = idt + 1
  1582.         rfile.PictureType(i) = 2
  1583.         i = i + 1
  1584.       End If
  1585.     End If
  1586.     p1 = p2 + 1
  1587.   Loop
  1588.  
  1589.   rfile.Expand(isave) = True
  1590.   rfile.Enabled = True
  1591.   mousepointer = DEFAULT
  1592.  
  1593. End Sub
  1594.  
  1595. Sub transfer_cancel_Click ()
  1596.  
  1597.   cntl_send Chr$(255) + Chr$(244)
  1598.   cntl_send "ABOR"
  1599.   Hide
  1600.  
  1601. End Sub
  1602.  
  1603. Sub trash_DragDrop (Source As Control, X As Single, Y As Single)
  1604.   
  1605.   On Error Resume Next
  1606.  
  1607.   If Source = lfile Then
  1608.     If MsgBox("Delete " + lfile_path + "?", 36) = 6 Then
  1609.       Kill lfile_path
  1610.       If Err Then
  1611.         log_message "!!! " + lfile_name + " NOT DELETED !!!"
  1612.         log_message "!!! Error" + Str$(Err) + " while deleting " + lfile_name
  1613.  
  1614.         lfile.DragMode = 0
  1615.         rfile.DragMode = 0
  1616.         Exit Sub
  1617.       End If
  1618.       lfile.RemoveItem lfile.ListIndex
  1619.     End If
  1620.   ElseIf Source = rfile Then
  1621.     If MsgBox("Delete " + rfile_path + "?", 36) = 6 Then
  1622.       cntl_send "DELE " + rfile_path
  1623.       z = cntl_recv(1)
  1624.       rfile.RemoveItem rfile.ListIndex
  1625.     End If
  1626.   End If
  1627.   
  1628.   lfile.DragMode = 0
  1629.   rfile.DragMode = 0
  1630.  
  1631. End Sub
  1632.  
  1633.